import re

with open("../the-verdict.txt", "r", encoding="utf-8") as f:  # 打开文件“the-verdict.txt”进行读取
    raw_text = f.read()  # 读取文件内容
print("Total number of character:", len(raw_text))  # 打印字符总数
print(raw_text[:99])  # 打印前99个字符

preprocessed = re.split(r'([,.;;?!\'()\`\"]|\s|--)', raw_text)#用正则表达式拆分整个文本，包括标点符号和空格
preprocessed = [item.strip() for item in preprocessed if item.strip()]  # 去除列表中的空格字符
print(len(preprocessed))  # 打印分词后的词元数量
# 上述打印语句输出4690，这是该文本中的词元数量（不包括空格字符）。
print(preprocessed[:30])  # 打印前30个词元

all_words = sorted(set(preprocessed))  # 获取唯一词元并按字母顺序排序
vocab_size = len(all_words)  # 计算词汇表的大小
vocab = {token: integer for integer, token in enumerate(all_words)}  # 创建词汇表，将词元映射到唯一整数
for i, item in enumerate(vocab.items()):  # 枚举词汇表中的条目
    print(item)  # 打印条目
    if i > 50:  # 只打印前50个条目
        break  # 跳出循环

class SimpleTokenizerV1:  # 定义SimpleTokenizerV1类
    def __init__(self, vocab):  # 初始化方法
        self.str_to_int = vocab  # 将词汇表存储为类属性，便于在encode和decode方法中访问  #A
        self.int_to_str = {i: s for s, i in vocab.items()}  # 创建一个逆词汇表，将词元ID映射回原始文本词元

    def encode(self, text):  # 定义encode方法，将输入文本转换为词元ID
        preprocessed = re.split(r'([,.;;?!\'()\`\"]|\s)', text)  # 使用正则表达式拆分文本，包括标点符号和空格
        preprocessed = [item.strip() for item in preprocessed if item.strip()]  # 去除列表中的空格字符
        preprocessed = [item if item in self.str_to_int  # 替换未知单词为<unk>词元
                        else "<unk>" for item in preprocessed]
        ids = [self.str_to_int[s] for s in preprocessed]  # 将词元转换为词元ID
        return ids  # 返回词元ID列表

    def decode(self, ids):  # 定义decode方法，将词元ID转换回文本
        text = " ".join([self.int_to_str[i] for i in ids])  # 将词元ID转换回文本词元并连接成字符串
        text = re.sub(r'\s+([,.;;?!\'()\`\"])', r'\1', text)  # 替换指定标点符号前的空格
        return text  # 返回文本字符串

tokenizer = SimpleTokenizerV1(vocab)  # 实例化SimpleTokenizerV1类的对象
text = """'It's the last he painted, you know,' Mrs. Gisburn said with pardonable pride."""  # 示例文本
ids = tokenizer.encode(text)  # 编码文本，生成词元ID
print(ids)  # 打印词元ID

print(tokenizer.decode(ids))  # 打印解码后的文本
# 输出以下文本：

# text = "Hello, do you like tea?"  # 示例文本
# print(tokenizer.encode(text))  # 尝试编码新文本
# # 运行上述代码将导致以下错误：
# # KeyError: 'Hello'

all_tokens = sorted(list(set(preprocessed)))  # 获取唯一词元并按字母顺序排序
all_tokens.extend(["<endoftext>", "<unk>"])  # 添加特殊词元
vocab = {token: integer for integer, token in enumerate(all_tokens)}  # 创建词汇表，将词元映射到唯一整数
print(len(vocab.items()))  # 打印词汇表的大小
# 根据上面的打印语句输出，新的词汇表大小为1161（上一节中的词汇表大小为1159）。

for i, item in enumerate(list(vocab.items())[-5:]):  # 枚举词汇表中的最后5个条目
    print(item)  # 打印条目

text1 = "Hello, do you like tea?"  # 示例文本1
text2 = "In the sunlit terraces of the palace."  # 示例文本2
text = " <endoftext> ".join((text1, text2))  # 使用<endoftext>连接两个文本
print(text)  # 打印连接后的文本

tokenizer = SimpleTokenizerV1(vocab)  # 实例化SimpleTokenizerV2类的对象
print(tokenizer.encode(text))  # 打印编码后的词元ID
# 打印以下词元ID：
# [1160, 5, 362, 1155, 642, 1000, 10, 1159, 57, 1013, 981, 1009, 738, 1013, 1160, 7]

print(tokenizer.decode(tokenizer.encode(text)))  # 打印解码后的文本
# 输出如下：<unk>, do you like tea? <endoftext> In the sunlit terraces of the <unk>.








